const http = require('http');
const querystring = require('querystring');
const url = require('url');
http.createServer((req, res) => {
  console.log(req.method);
  let arr = [];
  req.on('data', (chunk) => {
    arr.push(chunk);
  });
  req.on('end',(chunk)=>{
    // console.log('req end chunk:',chunk); //undefined //没有参数
    console.log(Buffer.concat(arr).toString());
    const str = Buffer.concat(arr).toString();
    const queryStringObj = url.parse(req.url,true).query;
    //访问->http://localhost:3000/abc?name=%E5%A4%A7%E9%BB%84&age=11
    console.log('req.url:',req.url); //req.url: /abc?name=%E5%A4%A7%E9%BB%84&age=11 //TODO cas3 中文直接通过url传过来的会被浏览器进行编码 拓展：URI编码问题
    console.log('url.parse(req.url).query:',url.parse(req.url).query); //url.parse(req.url).query: name=%E5%A4%A7%E9%BB%84&age=11
    console.log('queryStringObj.name:',queryStringObj.name);  //queryStringObj.name: 大黄 ← 说明当url.parse置为true时 不仅会将querystring转成obj 还会decode

    //TODO case1
    /*const r = JSON.parse(str);
    res.end(r.x + ""); //写入的必须是 `buffer` 或则 `字符串`，数字是不行的*/

    //TODO case2
    //虽然我们客户端设置请求头key的时使用的大写，但通过nodejs拿到的都会转为小写
    let r;
    if (req.headers['content-type'] === 'application/x-www-form-urlencoded') {
      // a=1&b=2 = {a:1,b:2}  /([^=&]+)=([^=&]+)/
      //url.parse只能解析完整的url 或则至少要有url path即端口后之后到hash之前的部分(也是我们req.url获取的请求行中的url显示的样子) 而不能单单对querystring解析
      r = querystring.parse(str, '&', '=').b; //sep和eq参数可以自定义 默认就分别为& =
    }else if(req.headers['content-type'] === 'application/json'){
      r = JSON.parse(str).a;
    }else{
      r = str;
    }

    //并且服务端响应客户端数据时也需要发给它这么一个头以便客户端解析数据
    // ，而这个Content-Type往往和要返回给客户端的资源文件的后缀名是相关联的
    //一般不会手写，而是使用一个包 → mime

    //关于响应状态码
    res.statusCode = 200;
    // res.statusMessage = 'fff';
    //Status Code: 200 fff 会在响应头中这样返回
    //如果不写 statusMessage node会帮我们自动补全 成标准的响应信息 比如200就是ok
    //Status Code: 200 OK

    res.end(r + '');
  })
}).listen(3000,()=>{
  console.log('server is running at 3000')
});
